Me encuentro con un error al intentar usar parámetros como parte de mi consulta.
Las partes notables de mi esquema son:
name_tokens tsvector
cards.rarity card_rarity que es una enumeración personalizada creada a partir de: create type card_rarity as enum ('C', 'T', 'R', 'S', 'M', 'L', 'F', 'P');
La consulta problemática es:
SELECT cards.* FROM cards WHERE (name_tokens @@ to_tsquery("$1"::text)) AND (cards.rarity = "$2"::card_rarity) ORDER BY cards.id;con entrada de:
[ 'absorb & in', 'L' ]Cuando ejecuto esto, el error dice:
UnhandledPromiseRejectionWarning: error: column "$3" does not exist .
Cuando ejecuto esta consulta sin parámetros, funciona bien, es decir:
SELECT cards.* FROM cards WHERE (name_tokens @@ to_tsquery('absorb & in') AND (cards.rarity = 'L') ORDER BY cards.id;Me gustaría poder utilizar parámetros, ya que lanzar cadenas de usuario directamente en una consulta puede ser peligroso.
¿Alguna idea de por qué recibo este error? Supongo que es un formato incorrecto o el uso de comillas cuando no debería o algo así. Cualquier ayuda es apreciada :)
Editar: Se sugirió que probé:
SELECT cards.* FROM cards WHERE (name_tokens @@ to_tsquery($1::text)) AND (cards.rarity = $2::card_rarity) ORDER BY cards.id; Pero cuando hago esto, aparece el siguiente error: UnhandledPromiseRejectionWarning: error: could not determine data type of parameter $1
PostgreSQL usa comillas dobles para los identificadores (como nombres de tablas y columnas), por lo que esto:
SELECT cards.* FROM cards WHERE (name_tokens @@ to_tsquery("$1"::text)) AND (cards.rarity = "$2"::card_rarity) ORDER BY cards.id; contiene dos identificadores entrecomillados "$1" y "$2" , pero ningún marcador de posición numerado.
Si desea utilizar marcadores de posición numerados, elimine las comillas dobles:
SELECT cards.* FROM cards WHERE (name_tokens @@ to_tsquery($1::text)) AND (cards.rarity = $2::card_rarity) ORDER BY cards.id; Sin embargo, no estoy seguro de dónde obtiene "$3" , supongo que el error proviene de una consulta diferente con un error de cotización similar.